iT邦幫忙

2026 iThome 鐵人賽

DAY 3
0
Security

從情資收集到資安鑑識:30 天建構自動化威脅情資與鑑識平台系列 第 3

[Day 03]GitHub Actions - .github/workflows 說明

  • 分享至 

  • xImage
  •  

YML 設定檔重點與邏輯解析

  • 根目錄限制:資料夾必須建立在專案的最外層。
  • 隱藏資料夾:第一層必須命名為 .github(特別強調前面的小數點不可漏掉)。
  • 工作流程資料夾:第二層必須命名為 workflows(特別強調字尾的 s)。
  • YAML 檔案:將你的設定檔(例如 monitor.yml)放置於此目錄下。
    https://ithelp.ithome.com.tw/upload/images/20260917/20184295iS8CtcPwLs.jpg

A. 觸發條件 (Triggers)

我們要告訴 GitHub 什麼時候該派出抓取情資。建議使用「雙軌制」觸發機制:

  • 定時排程 (schedule):透過 Cron 語法來設定執行時間。由於 GitHub 伺服器使用的是 UTC 時間,要換算成台灣時間 (GMT+8) 需要減去 8 小時。設定為 0 23,0,4,5 * * *,代表系統會在台灣時間的每天 07:00、08:00、12:00 與 13:00 自動啟動。
  • 手動觸發 (workflow_dispatch):這個設定允許我們在開發或除錯階段,隨時從 GitHub 後台手動點擊按鈕來觸發腳本執行。

B. 儲存庫讀寫權限 (Permissions)

為了讓自動化機器人能將收集到的情資寫回我們的專案中,必須正確配置權限。這需要完成兩層設定:

  • YML 檔案宣告:在設定檔中加入 permissions: contents: write,宣告機器人具備寫入內容的權限。
  • GitHub 後台開啟:請依序前往儲存庫的 Settings > Actions > General > Workflow permissions。在這裡必須確保勾選「Read and write permissions」並儲存設定,才能真正獲得可寫入權限。

C. 機密資訊注入 (Secrets)

在 Day2 我用了郵件預警功能,在執行 python main.py 階段,安全地將前置作業準備好的 MAIL_USERNAMEMAIL_PASSWORDMAIL_TO 透過 GitHub Secrets 注入為環境變數,確保敏感的應用程式密碼不會直接暴露在程式碼中。

D. 執行核心系統 (Core Execution)

前置作業完成後,最後就是讓系統啟動並執行我們的 Python 程式:

  • 環境建置與快取:系統會啟動最新版的 Ubuntu 環境 (ubuntu-latest),安裝 Python 3.10。接著會自動安裝 requestsbeautifulsoup4feedparserplaywright 等必備套件。
  • 核心調度:執行 python main.py。這支程式是整套監控系統的核心調度程式,負責串聯資料抓取、過濾、分析到發送警報的完整自動化生命週期。
  • 狀態更新與備份:執行完畢後,腳本會透過 Git 指令將更新後的狀態檔 (last_seen.json)、原始抓取紀錄 (raw_discovery.csv)、預警發送紀錄 (alert_history.log) 以及 Markdown 報表資料夾 (history_logs/*.md) 提交並推送回 GitHub。
  • 防無限迴圈機制:在自動 Commit 時,特別在訊息中加入了 [skip ci] 標籤。這個小細節非常重要,它能防止這次的自動推送再次觸發 GitHub Actions,避免系統陷入無窮無盡的執行迴圈。

環境建置與效能優化

  • Python 與套件安裝:基於 ubuntu-latest 環境,指定 Python 3.10,並自動安裝爬蟲必備的 requestsbeautifulsoup4feedparserplaywright 套件。
  • 快取機制 (Caching):這是非常棒的建置重點!你特別加入了 Playwright 瀏覽器的快取 (actions/cache@v4) 以及 Python pip 快取,這能大幅縮短每次 Action 啟動的等待時間並節省免費的運算資源。

自動化狀態儲存 (Git Push)

  • 資料持久化:腳本執行完畢後,會自動設定 Git 身分,並將更新後的狀態檔 last_seen.json、原始資料、報表資料夾 history_logs/*.md 追蹤並寫回儲存庫。
  • 防呆與迴圈防護:利用 git diff --staged --quiet 判斷是否真的有新變更才進行 Commit,並且在 Commit 訊息中加入 [skip ci],這是一個重要的防護機制,能防止這次自動推送意外再次觸發 GitHub Actions 造成無限迴圈。

最後附上我現在使用的YML 提供慘考

name: 情OOOOOOO統

on:
  schedule:
    #- cron: '0 0,5 * * *'  # 每天 08:00 與 13:00 台北時間執行
    # 這裡使用 UTC 時間,台灣時間 (GMT+8) 需減去 8 小時
    # 07:00 -> 23:00 (前一天)
    # 08:00 -> 00:00
    # 12:00 -> 04:00
    # 13:00 -> 05:00
    - cron: '0 23,0,4,5 * * *'
  workflow_dispatch:      # 允許手動觸發

permissions:
  contents: write

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      # 1. 設定 Python
      - uses: actions/setup-python@v5
        with:
          python-version: '3.10'
          cache: 'pip' 

      - name: Install Python dependencies
        run: |
          pip install requests beautifulsoup4 feedparser playwright

      # 2. 實作 Playwright 瀏覽器快取 (加速執行)
      - name: Cache Playwright browsers
        uses: actions/cache@v4
        with:
          path: ~/.cache/ms-playwright
          key: ${{ runner.os }}-playwright-${{ hashFiles('**/requirements.txt') }}
          restore-keys: |
            ${{ runner.os }}-playwright-

      # 3. 安裝瀏覽器
      - name: Install Browser and System Dependencies
        run: |
          playwright install chromium
          playwright install-deps chromium

      # 4. 執行監控程式 (這裡會看到 main.py 裡的各階段 print 輸出)
      - name: Run Monitor
        env:
          MAIL_USERNAME: ${{ secrets.MAIL_USERNAME }}
          MAIL_PASSWORD: ${{ secrets.MAIL_PASSWORD }}
          MAIL_TO: ${{ secrets.MAIL_TO }}
          HTTP_TIMEOUT: 20
        run: python main.py

      # 5. [除錯專用] 顯示本次執行結果摘要
      - name: Display Execution Summary (Debug)
        run: |
          echo "==== [DEBUG] 原始抓取紀錄 (最後 5 筆) ===="
          if [ -f "raw_discovery.csv" ]; then tail -n 5 raw_discovery.csv; else echo "raw_discovery.csv 不存在"; fi
          
          echo -e "\n==== [DEBUG] 預警發送紀錄 (最後 5 筆) ===="
          if [ -f "alert_history.log" ]; then tail -n 5 alert_history.log; else echo "無發送紀錄"; fi
          
          echo -e "\n==== [DEBUG] 狀態檔案檢查 ===="
          ls -lh last_seen.json

      # 6. 提交變更並推送回 GitHub
      - name: Commit and push changes
        run: |
          git config --local user.email "action@github.com"
          git config --local user.name "GitHub Action"
          
          # 確保所有新的紀錄檔都被追蹤
          git add last_seen.json
          
          # 加入全量原始紀錄與預警紀錄
          if [ -f "raw_discovery.csv" ]; then git add raw_discovery.csv; fi
          if [ -f "alert_history.log" ]; then git add alert_history.log; fi
          
          # 加入 Markdown 報表資料夾
          if [ -d "history_logs" ]; then
            git add history_logs/*.md || echo "No new reports found"
          fi
          
          # 檢查是否有變更需要 commit
          if git diff --staged --quiet; then
            echo "沒有任何變更需要提交"
          else
            git commit -m "Automated update: $(date +'%Y-%m-%d %H:%M:%S') [skip ci]"
            git push
          fi

上一篇
[Day 02]GitHub Actions - README.md 說明
系列文
從情資收集到資安鑑識:30 天建構自動化威脅情資與鑑識平台3
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言